import { ElMessage } from 'element-plus'
import { startsApi, douZhuanXingYiApi, getNowLunarDateApi, getNowGanZhiApi, ganZhiToDateApi } from '@/api/gongju/qimenpaipan-api.js' // 奇门排盘API接口
import { dateFormatter1, dateFormatter2 } from '@/assets/js/main.js' // 通用js

export default {
  el: 'app',
  data() {
    return {
      /* 完整数据 */
      data: {}, // 完整数据
      dataStatus: false, // 完整数据状态（true:存在。false:不存在）
      /* 默认数据 */
      dataD: {}, // 默认数据
      dataDStatus: false, // 默认数据状态（true:存在。false:不存在）

      /* 选项 */
      name: null, // 姓名
      occupy: null, // 占事
      sex: 1, // 性别
      sexOptions: [
        { value: '男', label: 1 },
        { value: '女', label: 0 }
      ],
      date: '', // 日期
      dateType: 0, // 日期类型
      dateTypeOptions: [
        { value: '公历', label: 0 },
        { value: '农历', label: 1 },
        { value: '四柱', label: 2 }
      ],
      leapMonth: false, // 是否闰月（true:是。false:否）
      trueSolar: false, // 是否真太阳时（true:是。false:否）
      address: '110000', // 地区：城市编码
      addressName: '北京市', // 地区：城市名称
      paiPanType: 0, // 排盘类型
      paiPanTypeOptions: [
        { value: '转盘', label: 0 },
        { value: '飞盘', label: 1 }
      ],
      qiMenType: 3, // 奇门类型
      qiMenTypeOptions: [
        { value: 0, label: '年家奇门' },
        { value: 1, label: '月家奇门' },
        { value: 2, label: '日家奇门' },
        { value: 3, label: '时家奇门' },
        { value: 4, label: '刻家奇门(十分钟)', disabled: true, title: '正在完善' },
        { value: 5, label: '刻家奇门(两分钟)', disabled: true, title: '正在完善' }
      ],
      paiPanSystem: 0, // 排盘方法
      paiPanSystemOptions: [
        { value: 0, label: '拆补法' },
        { value: 1, label: '置闰法', disabled: true, title: '正在完善' },
        { value: 2, label: '超神法', disabled: true, title: '正在完善' }
      ],
      yearGanZhiSet: 1, // 年干支设置
      yearGanZhiSetOptions: [
        { value: 0, label: '以正月初一作为新年的开始' },
        { value: 1, label: '以立春当天作为新年的开始' },
        { value: 2, label: '以立春交接的时刻作为新年的开始' }
      ],
      monthGanZhiSet: 1, // 月干支设置
      monthGanZhiSetOptions: [
        { value: 0, label: '以节交接当天起算' },
        { value: 1, label: '以节交接时刻起算' }
      ],
      dayGanZhiSet: 1, // 日干支设置
      dayGanZhiSetOptions: [
        { value: 0, label: '晚子时日干支算明天' },
        { value: 1, label: '晚子时日干支算当天' }
      ],
      hourGanZhiSet: 0, // 时干支设置
      hourGanZhiSetOptions: [{ value: 0, label: '支持早子时和晚子时' }],
      jieQi: 0, // 节气算法
      jieQiOptions: [
        { value: 0, label: '按天计算' },
        { value: 1, label: '不按天计算' }
      ],
      zhiShi: 0, // 值使排法
      zhiShiOptions: [
        { value: 0, label: '一律用死门为值使' },
        { value: 1, label: '根据阴阳遁判断' },
        { value: 2, label: '根据节气判断' }
      ],
      renPanFeiZhuan: 1, // 人盘排法（排盘类型为飞盘时生效）
      renPanFeiZhuanOptions: [
        { value: 0, label: '转宫' },
        { value: 1, label: '飞宫' }
      ],
      renPanZhuanGong: 0, // 人盘转宫法（排盘类型为飞盘时生效）
      renPanZhuanGongOptions: [
        { value: 0, label: '阴遁和阳遁一律顺转九宫' },
        { value: 1, label: '阴遁逆转九宫、阳遁顺转九宫' }
      ],
      renPanFeiGong: 0, // 人盘飞宫法（排盘类型为飞盘时生效）
      renPanFeiGongOptions: [
        { value: 0, label: '阴遁和阳遁一律顺飞九宫' },
        { value: 1, label: '阴遁逆飞九宫、阳遁顺飞九宫' }
      ],
      tianPanFeiGong: 0, // 天盘飞宫法（排盘类型为飞盘时生效）
      tianPanFeiGongOptions: [
        { value: 0, label: '阴遁和阳遁一律顺飞九宫' },
        { value: 1, label: '阴遁逆飞九宫、阳遁顺飞九宫' }
      ],
      shenPanFeiGong: 1, // 神盘飞宫法（排盘类型为飞盘时生效）
      shenPanFeiGongOptions: [
        { value: 0, label: '阴遁和阳遁一律顺飞九宫' },
        { value: 1, label: '阴遁逆飞九宫、阳遁顺飞九宫' }
      ],
      startsButton: false, // 排盘按钮状态（true:正在排盘。false:未排盘）
      startsDelayTime: 0, // 排盘延迟时间（单位：毫秒）

      /* 重新加载 */
      reLoadingButton: true, // 重新加载按钮状态（true:可用。false:禁用）

      /* 快捷 */
      year: 0, // 当前年
      month: 0, // 当前月
      day: 0, // 当前日
      hour: 0, // 当前时
      minute: 0, // 当前分
      second: 0, // 当前秒
      nowLunarStr: '', // 当前农历日期
      nowDayHourGanZhi: '', // 当前日期的日柱
      twelveHours: null, // 十二时辰
      twelveHoursProve: [
        { time: 0, prove: '昨日23:00:00 ~ 今日00:59:59' },
        { time: 1, prove: '01:00:00 ~ 02:59:59' },
        { time: 3, prove: '03:00:00 ~ 04:59:59' },
        { time: 5, prove: '05:00:00 ~ 06:59:59' },
        { time: 7, prove: '07:00:00 ~ 08:59:59' },
        { time: 9, prove: '09:00:00 ~ 10:59:59' },
        { time: 11, prove: '11:00:00 ~ 12:59:59' },
        { time: 13, prove: '13:00:00 ~ 14:59:59' },
        { time: 15, prove: '15:00:00 ~ 16:59:59' },
        { time: 17, prove: '17:00:00 ~ 18:59:59' },
        { time: 19, prove: '19:00:00 ~ 20:59:59' },
        { time: 21, prove: '21:00:00 ~ 22:59:59' }
      ],
      jgw: [4, 9, 2, 3, 5, 7, 8, 1, 6], // 后天八卦宫位
      jgm: ['巽四', '离九', '坤二', '震三', '中五', '兑七', '艮八', '坎一', '乾六'], // 后天八卦宫位标识
      jgs: ['mu', 'huo', 'tu', 'mu', 'tu', 'jin', 'tu', 'shui', 'jin'], // 后天八卦宫位标识样式
      jggMode: false, // 九宫格模式（true:详细。false:精简）
      jggModeT: '详细', // 九宫格模式标题

      luoGongTitle: ['坎一宫', '坤二宫', '震三宫', '巽四宫', '中五宫', '乾六宫', '兑七宫', '艮八宫', '离九宫'], // 九宫宫位中的名称
      luoGongIndex: 1, // 落宫
      jiuGongDiZhi: [['子'], ['未', '申'], ['卯'], ['辰', '巳'], [], ['戌', '亥'], ['酉'], ['丑', '寅'], ['午']], // 九宫中的地支
      baMenTitle: ['休门', '死门', '伤门', '杜门', '', '开门', '惊门', '生门', '景门'], // 九宫中的八门
      jiuXingTitle: ['天蓬星', '天芮星', '天冲星', '天辅星', '', '天心星', '天柱星', '天任星', '天英星'], // 九宫中的九星

      // 斗转星移
      jiuGongGeMode: false, // 九宫格模式（true:详细。false:精简）
      jiuGongGeModeTitle: '详细', // 九宫格模式标题
      douZhuanXingYiMode: '0', // 斗转星移模式
      douZhuanXingYiModeOptions: [
        { value: '顺时针旋转', label: '0' },
        { value: '逆时针旋转', label: '1' }
      ],
      douZhuanXingYiType: '0', // 斗转星移类型
      douZhuanXingYiTypeOptions: [
        { value: '全盘', label: '0' },
        { value: '地盘', label: '1' },
        { value: '天盘', label: '2' },
        { value: '人盘', label: '3' },
        { value: '神盘', label: '4' }
      ],

      /* 弹窗 */
      seniorDialog: false, // 高级选项弹窗状态（true:显示。false:隐藏）
      siZhuDialog: false, // 四柱转日期弹窗状态（true:显示。false:隐藏）

      /* 四柱转日期 */
      siZhuToDateColumns: [
        // 日期表格标题
        { type: 'index', title: '序号', width: 60, align: 'center', resizable: true },
        { title: '公历日期', key: 'solar', width: 150, align: 'center', resizable: true },
        { title: '农历日期', key: 'lunar', width: 200, align: 'center', resizable: true },
        { title: '操作', slot: 'action', align: 'center', resizable: true }
      ],
      siZhuToDate: [], // 日期
      siZhuToDateTotal: 0, // 日期条数
      siZhuButton: false, // 四柱转日期按钮状态（true:获取中。false:未获取）
      beginYear: 1900, // 起始年
      beginYear2: 0, // 起始年
      yearGanZhi: null, // 年干支
      monthGanZhi: null, // 月干支
      dayGanZhi: null, // 日干支
      hourGanZhi: null, // 时干支
      ganZhiOptions: [
        // 六十甲子
        { value: '甲子', label: '甲子' },
        { value: '甲戌', label: '甲戌' },
        { value: '甲申', label: '甲申' },
        { value: '甲午', label: '甲午' },
        { value: '甲辰', label: '甲辰' },
        { value: '甲寅', label: '甲寅' },
        { value: '乙丑', label: '乙丑' },
        { value: '乙亥', label: '乙亥' },
        { value: '乙酉', label: '乙酉' },
        { value: '乙未', label: '乙未' },
        { value: '乙巳', label: '乙巳' },
        { value: '乙卯', label: '乙卯' },
        { value: '丙寅', label: '丙寅' },
        { value: '丙子', label: '丙子' },
        { value: '丙戌', label: '丙戌' },
        { value: '丙申', label: '丙申' },
        { value: '丙午', label: '丙午' },
        { value: '丙辰', label: '丙辰' },
        { value: '丁卯', label: '丁卯' },
        { value: '丁丑', label: '丁丑' },
        { value: '丁亥', label: '丁亥' },
        { value: '丁酉', label: '丁酉' },
        { value: '丁未', label: '丁未' },
        { value: '丁巳', label: '丁巳' },
        { value: '戊辰', label: '戊辰' },
        { value: '戊寅', label: '戊寅' },
        { value: '戊子', label: '戊子' },
        { value: '戊戌', label: '戊戌' },
        { value: '戊申', label: '戊申' },
        { value: '戊午', label: '戊午' },
        { value: '己巳', label: '己巳' },
        { value: '己卯', label: '己卯' },
        { value: '己丑', label: '己丑' },
        { value: '己亥', label: '己亥' },
        { value: '己酉', label: '己酉' },
        { value: '己未', label: '己未' },
        { value: '庚午', label: '庚午' },
        { value: '庚辰', label: '庚辰' },
        { value: '庚寅', label: '庚寅' },
        { value: '庚子', label: '庚子' },
        { value: '庚戌', label: '庚戌' },
        { value: '庚申', label: '庚申' },
        { value: '辛未', label: '辛未' },
        { value: '辛巳', label: '辛巳' },
        { value: '辛卯', label: '辛卯' },
        { value: '辛丑', label: '辛丑' },
        { value: '辛亥', label: '辛亥' },
        { value: '辛酉', label: '辛酉' },
        { value: '壬申', label: '壬申' },
        { value: '壬午', label: '壬午' },
        { value: '壬辰', label: '壬辰' },
        { value: '壬寅', label: '壬寅' },
        { value: '壬子', label: '壬子' },
        { value: '壬戌', label: '壬戌' },
        { value: '癸酉', label: '癸酉' },
        { value: '癸未', label: '癸未' },
        { value: '癸巳', label: '癸巳' },
        { value: '癸卯', label: '癸卯' },
        { value: '癸丑', label: '癸丑' },
        { value: '癸亥', label: '癸亥' }
      ],
      yearGanZhi2: null, // 年干支
      monthGanZhi2: null, // 月干支
      dayGanZhi2: null, // 日干支
      hourGanZhi2: null // 时干支
    }
  },
  watch: {
    sex(val) {
      // this.dataD.sex = (val === 0) ? '女' : '男'
    },
    date(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    dateType(val) {
      if (val !== 1) {
        this.leapMonth = false
      }
      if (val === 2) {
        this.getNowGanZhi() // 获取当前日期干支
      }
      if (val !== 2) {
        this.starts(true) // 开始排盘（默认数据）
      }
    },
    leapMonth(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    trueSolar(val) {
      if (val) this.elMessage(3000, true, 'warning', '真太阳时暂不可用')
    },
    addressName(val) {
      // this.starts(true) // 开始排盘（默认数据）
    },

    paiPanType(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    qiMenType(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    paiPanSystem(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    yearGanZhiSet(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    monthGanZhiSet(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    dayGanZhiSet(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    hourGanZhiSet(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    jieQi(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    zhiShi(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    renPanFeiZhuan(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    renPanZhuanGong(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    renPanFeiGong(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    tianPanFeiGong(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    shenPanFeiGong(val) {
      this.starts(true) // 开始排盘（默认数据）
    },
    beginYear(val) {
      if (val <= 0 || val === '') {
        this.beginYear = 1
      } else if (val > 9999) {
        this.beginYear = 9999
      }
    },
    siZhuDialog(val) {
      if (!val) {
        this.dateType = 0 // 日期类型转为公历
      }
    },
    hour(val) {
      this.date = new Date() // 更新至最新日期
      this.starts(true) // 开始排盘（默认数据）
      this.getNowLunarDate() // 获取当前农历日期、日柱时柱、十二时辰
    },
  },
  created() {
    this.date = new Date() // 初始化日期
    this.getNowSolarDate() // 获取当前实时公历年月日时分秒
    // this.starts(true) // 开始排盘（默认数据）
  },
  mounted() {

  },
  methods: {

    /* 选项区域操作 */

    /**
     * 获取地区名称
     * 
     * @param {list} data 地区数据集合
     */
    getAddressName(data) {
      this.addressName = data.n
    },

    /**
     * 重置选项
     */
    resetting() {
      this.name = '' // 姓名
      this.occupy = '' // 占事
      this.sex = 1 // 性别
      this.date = new Date() // 日期
      this.dateType = 0 // 日期类型
      this.leapMonth = false // 是否闰月
      this.trueSolar = false // 是否真太阳时
      this.address = '110000' // 地区：城市编码
      this.addressName = '北京市' // 地区：城市名称
      this.paiPanType = 0 // 排盘类型
      this.qiMenType = 3 // 奇门类型
      this.paiPanSystem = 0 // 排盘方法
      this.yearGanZhiSet = 1 // 年干支设置
      this.monthGanZhiSet = 1 // 月干支设置
      this.dayGanZhiSet = 1 // 日干支设置
      this.hourGanZhiSet = 0 // 时干支设置
      this.jieQi = 0 // 节气算法
      this.zhiShi = 0 // 值使排法
      this.renPanFeiZhuan = 1 // 人盘排法（排盘类型为飞盘时生效）
      this.renPanZhuanGong = 0 // 人盘转宫法（排盘类型为飞盘时生效）
      this.renPanFeiGong = 0 // 人盘飞宫法（排盘类型为飞盘时生效）
      this.tianPanFeiGong = 0 // 天盘飞宫法（排盘类型为飞盘时生效）
      this.shenPanFeiGong = 1 // 神盘飞宫法（排盘类型为飞盘时生效）
      this.yearGanZhiSet = 1 // 年干支设置
      this.monthGanZhiSet = 1 // 月干支设置
      this.dayGanZhiSet = 1 // 日干支设置
      this.hourGanZhiSet = 0 // 时干支设置
      this.jggMode = false // 九宫格模式
      this.douZhuanXingYi1 = '0' // 斗转星移模式1
      this.douZhuanXingYi2 = '0' // 斗转星移模式2
    },

    /**
     * 获取当前实时公历年月日时分秒
     */
    getNowSolarDate() {
      this.year = new Date().getFullYear()
      this.month = new Date().getMonth() + 1
      this.day = new Date().getDate()
      this.hour = new Date().getHours()
      this.minute = new Date().getMinutes()
      this.second = new Date().getSeconds()
      if (String(this.second).length === 1) this.second = '0' + this.second
      setInterval(() => {
        this.year = new Date().getFullYear()
        this.month = new Date().getMonth() + 1
        this.day = new Date().getDate()
        this.hour = new Date().getHours()
        this.minute = new Date().getMinutes()
        this.second = new Date().getSeconds()
        if (String(this.second).length === 1) this.second = '0' + this.second
      }, 1000)
    },

    /**
     * 获取当前农历日期、日柱时柱、十二时辰
     */
    getNowLunarDate() {
      // 发送请求
      getNowLunarDateApi(null).then((res) => {
        if (String(res.data.code) === '200') {
          if (null !== res.data.data) {
            this.nowLunarStr = res.data.data[0] // 农历日期
            this.nowDayHourGanZhi = res.data.data[1] // 日柱时柱
            this.twelveHours = res.data.data[2] // 十二时辰
            // this.elMessage(3000, true, 'success', res.data.msg || '操作成功')
          } else {
            // this.elMessage(3000, true, 'error', res.data.msg || '操作失败')
          }
        } else {
          // this.elMessage(3000, true, 'error', res.data.msg || '操作失败')
        }
      }).catch(() => {
        // this.elMessage(3000, true, 'error', '操作失败')
      })
    },

    //**********************************************************************************

    /* 数据区域操作 */

    /**
     * 开始排盘
     * 
     * @param {boolean} example 是否为默认数据（true:是。false:否）
     * @param {date} date 日期
     */
    starts(example, date) {
      this.reLoadingButton = false // 重新加载按钮状态：禁用
      // this.startsButton = true // 排盘按钮状态：正在排盘
      setTimeout(() => {
        // 构造条件
        let query = {
          name: this.name, // 姓名
          occupy: this.occupy, // 占事
          sex: this.sex, // 性别
          date: this.date, // 日期
          dateType: this.dateType, // 日期类型
          address: this.addressName, // 地区名称
          leapMonth: this.leapMonth === true ? 1 : 0, // 是否闰月
          paiPanType: this.paiPanType, // 排盘类型
          qiMenType: this.qiMenType, // 奇门类型
          paiPanSystem: this.paiPanSystem, // 排盘方法
          yearGanZhiSet: this.yearGanZhiSet, // 年干支设置
          monthGanZhiSet: this.monthGanZhiSet, // 月干支设置
          dayGanZhiSet: this.dayGanZhiSet, // 日干支设置
          hourGanZhiSet: this.hourGanZhiSet, // 时干支设置
          jieQi: this.jieQi, // 节气算法
          zhiShi: this.zhiShi, // 值使排法
          renPanFeiZhuan: this.renPanFeiZhuan, // 人盘排法
          renPanZhuanGong: this.renPanZhuanGong, // 人盘转宫法
          renPanFeiGong: this.renPanFeiGong, // 人盘飞宫法
          tianPanFeiGong: this.tianPanFeiGong, // 天盘飞宫法
          shenPanFeiGong: this.shenPanFeiGong // 神盘飞宫法
        }
        if (date) query.date = date
        // 发送请求
        startsApi(query).then((res) => {
          if (String(res.data.code) === '200') {
            if (null !== res.data.data) {
              if (example) {
                // 1、默认数据：更改默认数据状态
                this.dataDStatus = true // 默认数据状态（true:存在。false:不存在）
                this.startsButton = false // 排盘按钮状态：未排盘
                this.dataD = res.data.data // 默认数据
              } else {
                // 2、完整数据：更改完整数据状态
                this.dataStatus = true // 完整数据状态（true:存在。false:不存在）
                this.startsButton = false // 排盘按钮状态：未排盘
                this.data = res.data.data // 完整数据
                this.initializeDaYunLiuNian() // 初始化大运流年
              }
              this.reLoadingButton = true // 重新加载按钮状态：启用
              // this.elMessage(3000, true, 'success', res.data.msg || '操作成功')
            } else {
              this.startsButton = false // 排盘按钮状态：未排盘
              this.reLoadingButton = true // 重新加载按钮状态：启用
              // this.elMessage(3000, true, 'error', res.data.msg || '操作失败')
            }
          } else {
            this.startsButton = false // 排盘按钮状态：未排盘
            this.reLoadingButton = true // 重新加载按钮状态：启用
            // this.elMessage(3000, true, 'error', res.data.msg || '操作失败')
          }
        }).catch(() => {
          this.startsButton = false // 排盘按钮状态：未排盘
          this.reLoadingButton = true // 重新加载按钮状态：启用
          // this.elMessage(3000, true, 'error', '加载失败')
        })
      }, this.startsDelayTime)
    },

    /**
     * 设置时辰数并开始排盘
     * 
     * @param {number} hour 时辰数
     */
    setHourStarts(hour) {
      let date = this.date
      if (null !== hour || undefined !== hour) {
        date.setHours(hour) // 设置小时
        this.date = date
      } else {
        this.date = new Date()
      }
      this.starts(false) // 开始排盘（完整数据）
    },

    /**
     * 上下局
     * 
     * @param {boolean} status true:下一局。false:上一局
     */
    shangXiaJu(status) {
      // 日期格式化
      const date = dateFormatter2(this.data.solarStr)
      if (status) {
        // 下一局
        date.setHours(date.getHours() + 2)
        this.starts(false, date) // 开始排盘
      } else {
        // 上一局
        date.setHours(date.getHours() - 2)
        this.starts(false, date) // 开始排盘
      }
    },

    /**
     * 斗转星移
     */
    douZhuanXingYi() {
      // 判断排盘模式
      if (this.data.paiPanType === 0) {
        this.zhuanDouZhuanXingYi() // 斗转星移 - 转盘
      } else {
        this.feiDouZhuanXingYi() // 斗转星移 - 飞盘
      }
    },

    /**
     * 斗转星移 - 转盘
     */
    zhuanDouZhuanXingYi() {
      // 构造条件
      let query = {
        paiPanType: this.data.paiPanType, // 排盘类型（0:转盘。1:飞盘）
        jiJie: this.data.jiJie, // 季节
        hourZhi: this.data.baZi[3].substring(1, 2), // 日支
        douZhuanXingYiMode: this.douZhuanXingYiMode, // 斗转星移模式
        douZhuanXingYiType: this.douZhuanXingYiType, // 斗转星移类型
        diPan: this.data.diPan, // 地盘
        tianPan: this.data.tianPan, // 天盘
        tianPanQiYiToTq: this.data.tianPanQiYiToTq, // 天盘奇仪（包含天禽星）
        tianPanQiYiExTq: this.data.tianPanQiYiExTq, // 天盘奇仪（不包含天禽星）
        renPan: this.data.renPan, // 人盘
        shenPan: this.data.shenPan // 神盘
      }
      // 发送请求
      douZhuanXingYiApi(query).then((res) => {
        if (String(res.data.code) === '200') {
          let data = res.data.data
          if (null !== res.data.data) {
            this.data.baGuaWangShuai = data.baGuaWangShuai // 八卦旺衰
            this.data.jiuXingWangShuai = data.jiuXingWangShuai // 九星旺衰
            this.data.baMenWangShuai = data.baMenWangShuai // 八门旺衰
            if (null !== data.diPanQiYiLuoGongLink) {
              this.data.diPan = data.diPan // 地盘
              this.data.diPanQiYiLuoGongLink = data.diPanQiYiLuoGongLink // 地盘奇仪与落宫地支的关系
              this.data.shiGanKeYing = data.shiGanKeYing // 十干克应
              this.data.baMenKeYing = data.baMenKeYing // 八门克应
            }
            if (null !== data.tianPanQiYiLuoGongExTqLink && null !== data.tianPanQiYiLuoGongToTqLink) {
              this.data.tianPan = data.tianPan // 
              this.data.jiuXingLuoGongStatus = data.jiuXingLuoGongStatus // 九星落宫状态
              this.data.tianPanQiYiToTq = data.tianPanQiYiToTq // 天盘奇仪（包含天禽星）
              this.data.tianPanQiYiExTq = data.tianPanQiYiExTq //  天盘奇仪（不包含天禽星）
              this.data.tianPanQiYiLuoGongToTqLink = data.tianPanQiYiLuoGongToTqLink // 天盘奇仪与落宫地支的关系（包含天禽星）
              this.data.tianPanQiYiLuoGongExTqLink = data.tianPanQiYiLuoGongExTqLink // 天盘奇仪与落宫地支的关系（不包含天禽星）
              this.data.shiGanKeYing = data.shiGanKeYing // 十干克应
              this.data.baMenKeYing = data.baMenKeYing // 八门克应
              this.data.xingMenKeYing = data.xingMenKeYing // 星门克应
              this.data.jiuXingShiYing = data.jiuXingShiYing // 九星时应
            }
            if (null !== data.baMenLuoGongStatus) {
              this.data.renPan = data.renPan // 人盘
              this.data.baMenLuoGongStatus = data.baMenLuoGongStatus // 八门落宫状态
              this.data.baMenKeYing = data.baMenKeYing // 八门克应
              this.data.xingMenKeYing = data.xingMenKeYing // 星门克应
            }
            if (null !== data.baShenLuoGongStatus) {
              this.data.shenPan = data.shenPan // 神盘
              this.data.baShenLuoGongStatus = data.baShenLuoGongStatus // 八神落宫状态
            }
            this.kuoZhuanData() // 扩展数据
            // this.elMessage(true, 'success', res.data.msg || '操作成功')
          } else {
            this.elMessage(true, 'error', res.data.msg || '操作失败')
          }
        } else {
          this.elMessage(true, 'error', res.data.msg || '操作失败')
        }
      }).catch(() => {
        // this.elMessage(true, 'error', '操作失败')
      })
    },

    /**
     * 斗转星移 - 飞盘
     */
    feiDouZhuanXingYi() {
      // 构造条件
      let query = {
        paiPanType: this.data.paiPanType, // 排盘类型（0:转盘。1:飞盘）
        jiJie: this.data.jiJie, // 季节
        hourZhi: this.data.baZi[3].substring(1, 2), // 日支
        douZhuanXingYiMode: this.douZhuanXingYiMode, // 斗转星移模式
        douZhuanXingYiType: this.douZhuanXingYiType, // 斗转星移类型
        diPan: this.data.diPan, // 地盘
        tianPan: this.data.tianPan, // 天盘
        tianPanQiYi: this.data.tianPanQiYi, // 天盘奇仪
        renPan: this.data.renPan, // 人盘
        shenPan: this.data.shenPan // 神盘
      }
      // 发送请求
      douZhuanXingYiApi(query).then((res) => {
        if (String(res.data.code) === '200') {
          let data = res.data.data
          if (null !== res.data.data) {
            this.data.baGuaWangShuai = data.baGuaWangShuai // 八卦旺衰
            this.data.jiuXingWangShuai = data.jiuXingWangShuai // 九星旺衰
            this.data.baMenWangShuai = data.baMenWangShuai // 八门旺衰
            if (null !== data.diPanQiYiLuoGongLink) {
              this.data.diPan = data.diPan // 地盘
              this.data.diPanQiYiLuoGongLink = data.diPanQiYiLuoGongLink // 地盘奇仪与落宫地支的关系
              this.data.shiGanKeYing = data.shiGanKeYing // 十干克应
              this.data.baMenKeYing = data.baMenKeYing // 八门克应
            }
            if (null !== data.tianPanQiYiLuoGongLink) {
              this.data.tianPan = data.tianPan // 天盘
              this.data.jiuXingLuoGongStatus = data.jiuXingLuoGongStatus // 九星落宫状态
              this.data.tianPanQiYi = data.tianPanQiYi // 天盘奇仪
              this.data.tianPanQiYiLuoGongLink = data.tianPanQiYiLuoGongLink // 天盘奇仪与落宫地支的关系
              this.data.shiGanKeYing = data.shiGanKeYing // 十干克应
              this.data.baMenKeYing = data.baMenKeYing // 八门克应
              this.data.xingMenKeYing = data.xingMenKeYing // 星门克应
              this.data.jiuXingShiYing = data.jiuXingShiYing // 九星时应
            }
            if (null !== data.baMenLuoGongStatus) {
              this.data.renPan = data.renPan // 人盘
              this.data.baMenLuoGongStatus = data.baMenLuoGongStatus // 八门落宫状态
              this.data.baMenKeYing = data.baMenKeYing // 八门克应
              this.data.xingMenKeYing = data.xingMenKeYing // 星门克应
            }
            if (null !== data.jiuShenLuoGongStatus) {
              this.data.shenPan = data.shenPan // 神盘
              this.data.jiuShenLuoGongStatus = data.jiuShenLuoGongStatus // 九神落宫状态
            }
            this.kuoZhuanData() // 扩展数据
            // this.elMessage(true, 'success', res.data.msg || '操作成功')
          } else {
            this.elMessage(true, 'error', res.data.msg || '操作失败')
          }
        } else {
          this.elMessage(true, 'error', res.data.msg || '操作失败')
        }
      }).catch(() => {
        // this.elMessage(true, 'error', '操作失败')
      })
    },

    /**
     * 切换落宫
     * 
     * @param {number} index 落宫
     */
    switchLuoGong(index) {
      this.luoGongIndex = index // 设置落宫
      // this.kuoZhuanData() // 扩展数据
      // this.elMessage(3000, true, 'success', '宫位已切换为：' + this.luoGongTitle[index - 1])
    },




    /**
     * 获取当前日期干支
     */
    getNowGanZhi() {
      // 构造条件
      let query = {
        date: new Date(), // 日期
        yearGanZhiSet: this.yearGanZhiSet, // 年干支设置
        monthGanZhiSet: this.monthGanZhiSet, // 月干支设置
        dayGanZhiSet: this.dayGanZhiSet, // 日干支设置
        hourGanZhiSet: this.hourGanZhiSet // 时干支设置
      }
      // 发送请求
      getNowGanZhiApi(query).then((res) => {
        if (String(res.data.code) === '200') {
          if (null !== res.data.data) {
            this.beginYear = 1900
            this.yearGanZhi = res.data.data[0]
            this.monthGanZhi = res.data.data[1]
            this.dayGanZhi = res.data.data[2]
            this.hourGanZhi = res.data.data[3]
            this.yearGanZhi2 = res.data.data[0]
            this.monthGanZhi2 = res.data.data[1]
            this.dayGanZhi2 = res.data.data[2]
            this.hourGanZhi2 = res.data.data[3]
            this.siZhuDialog = true // 显示四柱转日期弹窗
            if (!this.siZhuDialog) this.dateType = 0 // 若四柱转日期弹窗未显示，则将日期类型转为公历
          }
        }
      }).catch(() => {
        this.dateType = 0 // 日期类型转为公历
      })
    },

    /**
     * 通过四柱获取日期
     */
    getSiZhuToDate() {
      // 构造条件
      let query = {
        beginYear: this.beginYear, // 起始年份
        yearGanZhi: this.yearGanZhi, // 年干支
        monthGanZhi: this.monthGanZhi, // 月干支
        dayGanZhi: this.dayGanZhi, // 日干支
        hourGanZhi: this.hourGanZhi, // 时干支
        yearGanZhiSet: this.yearGanZhiSet, // 年干支设置
        monthGanZhiSet: this.monthGanZhiSet, // 月干支设置
        dayGanZhiSet: this.dayGanZhiSet, // 日干支设置
        hourGanZhiSet: this.hourGanZhiSet // 时干支设置
      }
      this.beginYear2 = this.beginYear
      this.siZhuButton = true
      // 发送请求
      ganZhiToDateApi(query).then((res) => {
        if (String(res.data.code) === '200') {
          if (null !== res.data.data) {
            if (res.data.data.length !== 0) {
              this.siZhuToDate = res.data.data
              this.siZhuToDateTotal = res.data.data.length
              this.siZhuButton = false
            } else {
              this.siZhuToDate = {}
              this.siZhuToDateTotal = 0
              this.siZhuButton = false
              this.elMessage(3000, true, 'error', '没有和【' + this.yearGanZhi + ' ' + this.monthGanZhi + ' ' + this.dayGanZhi + ' ' + this.hourGanZhi + '】相匹配的日期')
            }
          }
        } else {
          this.siZhuToDate = {}
          this.siZhuToDateTotal = 0
          this.elMessage(3000, true, 'error', res.data.msg || '操作失败')
        }
      }).catch(() => {
        this.siZhuToDate = {}
        this.siZhuToDateTotal = 0
        // this.elMessage(3000, true, 'error', '操作失败')
      })
    },

    /**
     * 设置新日期
     * 
     * @param {string} newDate 公历日期
     */
    setNewDate(newDate) {
      this.date = dateFormatter1(newDate)
      this.siZhuDialog = false // 关闭四柱转日期弹窗
      this.elMessage(3000, true, 'success', '日期已设置')
    },

    //**********************************************************************************

    /* 通用操作 */

    /**
     * 五行颜色2
     * 
     * @param {string} wuXing 五行
     */
    WuXingColor2(wuXing) {
      let w1 = wuXing.substring(0, 1) // 五行1
      let w2 = wuXing.substring(1, 2) // 五行2
      let newW = '' // 新五行

      if ('木' === w1) {
        w1 = wuXing.replace(wuXing, '<font color="#07DA30">' + w1 + '</font>')
      }
      if ('火' === w1) {
        w1 = wuXing.replace(wuXing, '<font color="#d30505">' + w1 + '</font>')
      }
      if ('土' === w1) {
        w1 = wuXing.replace(wuXing, '<font color="#8b6d03">' + w1 + '</font>')
      }
      if ('金' === w1) {
        w1 = wuXing.replace(wuXing, '<font color="#ef9104">' + w1 + '</font>')
      }
      if ('水' === w1) {
        w1 = wuXing.replace(wuXing, '<font color="#2e83f6">' + w1 + '</font>')
      }

      if ('木' === w2) {
        newW = w1 + wuXing.replace(wuXing, '<font color="#07DA30">' + w2 + '</font>')
      }
      if ('火' === w2) {
        newW = w1 + wuXing.replace(wuXing, '<font color="#d30505">' + w2 + '</font>')
      }
      if ('土' === w2) {
        newW = w1 + wuXing.replace(wuXing, '<font color="#8b6d03">' + w2 + '</font>')
      }
      if ('金' === w2) {
        newW = w1 + wuXing.replace(wuXing, '<font color="#ef9104">' + w2 + '</font>')
      }
      if ('水' === w2) {
        newW = w1 + wuXing.replace(wuXing, '<font color="#2e83f6">' + w2 + '</font>')
      }

      return newW
    },






    /**
     * 消息提示
     * 
     * @param {number} duration 显示时间（单位：毫秒）
     * @param {boolean} showClose 是否可关闭（true:是。false:否）
     * @param {string} type 消息类型（success、warning、error）
     * @param {string} message 提示内容
     */
    elMessage(duration, showClose, type, message) {
      ElMessage({
        duration: duration,
        showClose: showClose,
        type: type,
        message: message,
        plain: true
      })
    }

  }

}
